#!/bin/csh -f

set ICE_SANDBOX = `pwd`
set ICE_VERSION = unknown
if (-e columnphysics/version.txt) then
  set ICE_VERSION = `head -1 columnphysics/version.txt | sed -e 's/ /_/g'`
endif
set ICE_SCRIPTS = "${ICE_SANDBOX}/configuration/scripts"
set initargv = ( $argv[*] ) 

set helpheader = 0
set dash = "-"
set spval = "UnDeFiNeD"
set machcomp = ${spval}
set machine = ${spval}
set envnames = intel
set case = ${spval}
set test = ${spval}
set grid = col
set pesx = 1x1
set sets = ""
set tdir = ${spval}
set bdir = ${spval}
set testid = ${spval}
set testsuite = ${spval}
set queue = ${spval}
set acct = ${spval}
set baseCom = ${spval}  # Baseline compare
set baseGen = ${spval}  # Baseline generate
set bfbcomp = ${spval}  # BFB compare
set report  = 0       # test results reporting
set sdate = `date -u "+%y%m%d"`
set stime = `date -u "+%H%M%S"`
set docase = 0
set dotest = 0
set dosuite = 0
set coverage = 0       # code coverage measurement and reporting
set coverageflag = false

if ($#argv < 1) then
  set helpheader = 1
endif

set argv = ( $initargv[*] )
# check for -h
while (1)
  if ($#argv < 1) break;
  if ("$argv[1]" =~ "-h" || "$argv[1]" =~ "--help") then
    set helpheader = 2
    if ("$argv[1]" == "-h") then
      set helpheader = 1
    endif
  endif
  shift argv
end

#------------------------------------------------------------
# Help output

if ( $helpheader > 0) then
cat << EOF1

NAME   
  icepack.setup

SYNOPSIS
    -h || --help
    
    --version

    --setvers versno

    --docintfc

    --case CASE -m MACH 
        [-e ENV][-p MxN][-g GRID][-s SET1,SET2][--acct ACCT]

    --test TEST -m MACH --testid ID 
        [-e ENV][-p MxN][-g GRID][-s SET1,SET2][--acct ACCT]
        [--diff TESTNAME][--bdir DIR][--bgen DIR][--bcmp DIR]
        [--tdir PATH]

    --suite SUITE[,SUITE2] -m MACH --testid ID 
        [-e ENV1,ENV2][--acct ACCT][--bdir DIR][--bgen DIR]
        [--bcmp DIR][--tdir PATH][--report || --coverage]

DESCRIPTION
    --help, -h : help
    --version  : generates icepack version number
    --setvers  : updates the icepack version number in the sandbox
    --docintfc : update the public interface documentation
    --case, -c : case, case directory/name (not with --test or --suite)
    --mach, -m : machine, machine name (required)
    --env,  -e : compilation environment name(s), comma separated (default = "intel")
    --pes,  -p : tasks x threads or "m"x"n" (default is 1x1)
    --queue    : queue name for batch submission
    --acct     : account number for the batch submission
    --grid, -g : grid, grid (default = col)
    --set,  -s : case option setting(s), comma separated (default = " ")

    For testing

    --test     : test, test name (not with --case or --suite)
    --suite    : test suite, pre-defined set or sets of tests, comma separated (not with --case or --test)
    --tdir     : directory name where tests will be located
    --bdir     : baseline directory for regression testing, default ICE_MACHINE_BASELINE
    --bgen     : directory name where output from current tests are copied
    --bcmp     : directory name where output from current tests are compared
    --testid   : test ID, user-defined id for testing (REQUIRED with --test or --suite)
    --diff     : generate comparison against another case
    --report   : automatically post results when tests are complete
    --coverage : generate and report test coverage metrics when tests are complete,
                 requires GNU envname (--env gnu)

EXAMPLES
    icepack.setup -c caseB -m gordon -e cray -s diag1,debug
    icepack.setup --case ~/caseA --mach cheyenne --env intel --set diag24
    icepack.setup --test restart -m onyx -e gnu -s debug -testid myid
    icepack.setup --suite base_suite -m conrad --env intel,cray --testid myv1 --bgen myv1
    icepack.setup --suite base_suite,travis_suite,quick_suite -m cheyenne --testid myv1 --bgen myv1
    icepack.setup --suite quick_suite -m cheyenne --testid myv2 --bgen myv2 --bcmp myv1

SEE ALSO
    icepack.setup --help or
    User Documentation at https://cice-consortium.github.io/Icepack/

EOF1

if ($helpheader > 1) then
cat << EOF1

      Available --mach and --env combinations are in configuration/scripts/machines and include:
EOF1
      set soptions1 = `ls -1 configuration/scripts/machines | grep Macros | sed 's/Macros.//g' `
      set soptions = `echo $soptions1 | fmt -1 | sort `
      foreach sopt ($soptions)
        echo "             $sopt"
      end
cat << EOF1

      Available --set options are in configuration/scripts/options and include:
EOF1
      set soptions1 = `ls -1 configuration/scripts/options | grep set_ | sed 's/set_nml.//g' | sed 's/set_env.//g' | sed 's/set_files.//g' `
      set soptions = `echo $soptions1 | fmt -1 | sort -u `
      foreach sopt ($soptions)
        echo "             $sopt"
      end

cat << EOF1

      Available tests are in configuration/scripts/tests and include:
EOF1
      set soptions1 = `ls -1 configuration/scripts/tests | grep test_ | grep script | sed 's/test_//g' | sed 's/.script//g' `
      set soptions = `echo $soptions1 | fmt -1 | sort `
      foreach sopt ($soptions)
        echo "             $sopt"
      end

cat << EOF1

      Available sets of predefined suites are in configurations/scripts/tests and include:
EOF1
      set soptions1 = `ls -1 configuration/scripts/tests | grep "\.ts" | sed 's/\.ts//g' `
      set soptions = `echo $soptions1 | fmt -1 | sort `
      foreach sopt ($soptions)
        echo "             $sopt"
      end

endif
exit -1
endif

#------------------------------------------------------------
# Read in command line arguments

echo " "
echo "${0}:"

set argv = ( $initargv[*] )
# check for --version
while (1)
  if ($#argv < 1) break;
  if ("$argv[1]" =~ "--version" ) then
    echo "${0}: This is ${ICE_VERSION}"
    exit -1
  endif
  shift argv
end

set argv = ( $initargv[*] )
# check for --setvers
while (1)
  if ($#argv < 1) break;
  if ("$argv[1]" =~ "--setvers" ) then
    shift argv
    if ( $#argv < 1 ) then
      echo "${0}: ERROR in --setvers argument"
      exit -1
    endif
    set versno = $argv[1]
    ${ICE_SCRIPTS}/set_version_number.csh $versno
    if ($status != 0) then
       echo "${0} ERROR in set_version_number.csh"
       exit -1
    endif
    echo "Setting ICEPACK version to ${versno} and exiting"
    exit -1
  endif
  shift argv
end

set argv = ( $initargv[*] )
# check for --docintfc
while (1)
  if ($#argv < 1) break;
  if ("$argv[1]" =~ "--docintfc" ) then
    echo "${0}: Running docintfc"
    echo " "
    cd ${ICE_SANDBOX}/doc
    ./generate_interfaces.sh
    cd ${ICE_SANDBOX}
    echo " "
    echo "${0}: docintfc complete, exiting"
    echo "${0}: remember to add and commit any updated documentation files"
    echo " "
    exit -1
  endif
  shift argv
end

set argv = ( $initargv[*] )
# read in all options
while (1)
  if ( $#argv < 1 ) break;
  set option = $argv[1];

# arguments without settings
  if ("$option" == "--report") then
    set report = 1
    shift argv

  else if ("$option" == "--coverage") then
    set coverage = 1
    set coverageflag = true
    shift argv

# arguments with settings
  else
    shift argv
    if ( $#argv < 1 ) then
      echo "${0}: ERROR in $option, unsupported or missing an argument"
      exit -1
    endif
    if ("$argv[1]" =~ "$dash*" ) then
      echo "${0}: ERROR in $option, possibly missing an argument"
      exit -1
    endif

    if ("$option" == "--case" || "$option" == "-c") then
      set case = $argv[1]
      set docase = 1
    else if ("$option" =~ --mach* || "$option" == "-m") then
      set machine = $argv[1]
    else if ("$option" =~ --env* || "$option" == "-e") then
      set envnames = $argv[1]
    else if ("$option" == "--test") then
      set test = $argv[1]
      set dotest = 1
    else if ("$option" == "--tdir") then
      set tdir = $argv[1]
    else if ("$option" == "--grid" || "$option" == "-g") then
      set grid = $argv[1]``
    else if ("$option" == "--queue") then
      set queue = $argv[1]
    else if ("$option" == "--pes" || "$option" == "-p") then
      set pesx = $argv[1]
    else if ("$option" == "--acct") then
      set acct = $argv[1]
    else if ("$option" =~ --set*  || "$option" == "-s") then
      set sets = $argv[1]
    else if ("$option" == "--bdir") then
      set bdir = $argv[1]
    else if ("$option" == "--bcmp") then
      set baseCom = $argv[1]
    else if ("$option" == "--bgen") then
      set baseGen = $argv[1]
    else if ("$option" == "--diff") then
      set bfbcomp = $argv[1]
    else if ("$option" == "--suite") then
      set testsuite = $argv[1]
      set dosuite = 1
    else if ("$option" == "--testid") then
      set testid = $argv[1]
    else
      echo "${0}: ERROR unknown option $option, use -h for help"
      exit -1
    endif

  shift argv

  endif
end

if (${machine} == ${spval}) then
  echo "${0}: ERROR in arguments, --mach required"
  exit -1
endif

@ dosum = ${docase} + ${dotest} + ${dosuite}
if (${dosum} == 0) then
  echo "${0}: ERROR in arguments, --case, --test, or --suite required"
  exit -1
endif

if (${dosum} > 1) then
  echo "${0}: ERROR in arguments, cannot use more than one of --case, --test, and --suite"
  exit -1
endif

if ($coverage == 1 && $report == 1) then
  echo "${0}: ERROR in arguments, not recommmended to set both --coverage and --report"
  exit -1
endif

if ($coverage == 1 && "$envnames" != "gnu") then
  echo "${0}: ERROR in arguments, must use --env gnu with --coverage"
  exit -1
endif

if ($coverage == 1 && `where curl` == "" && `where wget` == "") then
  echo "${0}: ERROR 'curl' or 'wget' is required for --coverage"
  exit -1
endif

if (${dosuite} == 0) then
  if ($report == 1) then
    echo "${0}: ERROR in arguments, must use --suite with --report"
    exit -1
  endif
  if ($coverage == 1) then
    echo "${0}: ERROR in arguments, must use --suite with --coverage"
    exit -1
  endif
  if ("$envnames" =~ "*,*") then
    echo "${0}: ERROR in arguments, cannot set multiple envnames without --suite"
    exit -1
  else
    set envname = ${envnames}
    set machcomp = ${machine}_${envname}
  endif
else
  if ($coverage == 1) then
    if ("$envnames" =~ "*,*") then
      echo "${0}: ERROR in arguments, cannot set multiple envnames with --coverage"
      exit -1
    else
      set envname = ${envnames}
      set machcomp = ${machine}_${envname}
    endif
  endif
endif

if ((${dosuite} == 1 || ${dotest} == 1) && ${testid} == ${spval}) then
  echo "${0}: ERROR in arguments.  --testid must be passed if using --suite or --test"
  exit -1
endif

#---------------------------------------------------------------------
# Setup tsfile and test suite support stuff

set tsdir  = "."
set tsfile = "caselist.${sdate}-${stime}"
if ( ${dosuite} == 1 ) then
  set tsdir  = "testsuite.${testid}"
  set tsfile = "testsuite.${testid}.${sdate}-${stime}.list"
endif
if ( ${tdir} != ${spval} ) then
  set tsdir = ${tdir}
endif
if (-e ${tsfile}) then
  echo "${0}: ERROR in tsfile, this should never happen"
  exit -1
endif

if ( ${dosuite} == 0 ) then
  set teststring = "${test} ${grid} ${pesx} ${sets}"
  if ( $bfbcomp != ${spval} ) then
    if ( ${sets} == "" ) then
      set teststring = "${teststring} none ${bfbcomp}"
    else
      set teststring = "${teststring} ${bfbcomp}"
    endif
  endif
  echo ${teststring} >! ${tsfile}
  set sets = ""

else
  set tarrays = `echo ${testsuite} | sed 's/,/ /g' | fmt -1 | sort -u`
  set testsuitecnt = 0
  foreach tarray ( ${tarrays} )
    @ testsuitecnt = ${testsuitecnt} + 1
    if (-e ${tarray}) then
      cat ${tarray} >> $tsfile
    else if (-e ${tarray}.ts) then
      cat ${tarray}.ts >> $tsfile
    else
      if (-e ${ICE_SCRIPTS}/tests/${tarray}.ts) then
        cat ${ICE_SCRIPTS}/tests/${tarray}.ts >> $tsfile
      else
        echo "${0}: ERROR, cannot find testsuite file ${tarray}, also checked ${ICE_SCRIPTS}/tests/${tarray}.ts"
        exit -1
      endif
    endif
  end

  if (-e ${tsdir}) then
    echo "${0}: ERROR, ${tsdir} already exists"
    exit -1
  endif

  mkdir -p ${tsdir}
  if ($status != 0) then
    echo "${0}: ERROR, mkdir ${tsdir} aborted"
    exit -1
  endif
  cp -f ${ICE_SCRIPTS}/tests/report_results.csh ${tsdir}
  cp -f ${ICE_SCRIPTS}/tests/timeseries.csh ${tsdir}
  cp -f ${ICE_SCRIPTS}/tests/poll_queue.csh ${tsdir}

cat >! ${tsdir}/suite.run << EOF0
#!/bin/csh -f
EOF0

  set remote = `git remote -v | grep -i origin | grep -i push | sed "s|.*\(https.*\)\s.*|\1|g"`
  set branch = `git status | grep -i "on branch" | sed 's|^.*ranch\s*\(\S*\)$|\1|g'`
  set hash     = `git log | grep -i commit | head -1 | cut -d " " -f 2-`
  set hashuser = `git log | grep -i author | head -1 | cut -d : -f 2-`
  set hashdate = `git log | grep -i date   | head -1 | cut -d : -f 2-`
  set cdate = `date -u "+%Y-%m-%d"`
  set ctime = `date -u "+%H:%M:%S"`
  set vers = ${ICE_VERSION}
  set shhash = `echo ${hash} | cut -c 1-10`

cat >! ${tsdir}/results.csh << EOF0
#!/bin/csh -f
rm -f results.log
echo "#------- " >> results.log
echo "#repo = ${remote}" >> results.log
echo "#bran = ${branch}" >> results.log
echo "#hash = ${hash}" >> results.log
echo "#hshs = ${shhash}" >> results.log
echo "#hshu = ${hashuser}" >> results.log
echo "#hshd = ${hashdate}" >> results.log
echo "#suit = ${testsuite}" >> results.log
echo "#date = ${cdate}" >> results.log
echo "#time = ${ctime}" >> results.log
echo "#mach = ${machine}" >> results.log
echo "#user = ${user}" >> results.log
echo "#vers = ${vers}" >> results.log
echo "#------- " >> results.log
EOF0

cat >! ${tsdir}/report_codecov.csh << EOF0
#!/bin/csh -f

source ${ICE_SCRIPTS}/machines/env.${machcomp}

set rn0 = "${sdate}-${stime}:${shhash}:${testsuitecnt}:${testsuite}"
set rn1 = \`echo \${rn0} | sed -e 's/ //g'\`
set report_name = \`echo \${rn1} | sed -e 's/_suite//g'\`

#for codecov
set use_curl = 1
# define CODECOV_TOKEN env variable
if !(\$?CODECOV_TOKEN) then
  if (-e ~/.codecov_icepack_token) then
    source ~/.codecov_icepack_token
  endif
  if !(\$?CODECOV_TOKEN) then
    echo "\${0}: ERROR, CODECOV_TOKEN env variable not defined"
    exit 2
  endif
endif

#for lcov
set lcovalist = ""

EOF0

  chmod +x ${tsdir}/suite.run
  chmod +x ${tsdir}/results.csh
  chmod +x ${tsdir}/report_codecov.csh
  cp -p -f ${tsdir}/report_codecov.csh ${tsdir}/report_lcov.csh

endif

#-------------------------------------------------------------------
# Loop over cases/tests

set nenvnames = "`echo $envnames | sed -e 's/,/ /g'`"

# check that machines and envnames are valid before starting big loop
set doabort = false
foreach envname ( $nenvnames )
  set machcomp = ${machine}_${envname}
  foreach file (env.${machcomp} Macros.${machcomp})
    if !(-e ${ICE_SCRIPTS}/machines/$file) then
      echo "${0}: ERROR, ${ICE_SCRIPTS}/machines/$file not found"
      set doabort = true
    endif
  end
end
if (${doabort} == true) then
  exit -1
endif

set sets_base = "${sets}"
set bfbcomp_base = "$bfbcomp"
foreach envname ( $nenvnames )
  set machcomp = ${machine}_${envname}
  foreach line ( "`cat $tsfile`" )
    # Check if line is a comment line
    if ( $line:q =~ '#'* || $line:q =~ '$'* || $line:q =~ '!'* ) then
      echo "skipping line: $line"
      continue
    endif

    # Obtain the test name, sets, grid, and PE information from .ts file
    set test = `echo $line | cut -d' ' -f1`
    set grid = `echo $line | cut -d' ' -f2`
    set pesx = `echo $line | cut -d' ' -f3`
    set sets_tmp = `echo $line | cut -d' ' -f4`
    set bfbcomp_tmp = `echo $line | cut -d' ' -f5`

    # Append sets from .ts file to the $sets variable
    set sets = "$sets_base,$sets_tmp"

    # Create a new bfbcomp_base variable to store bfbcomp passed to icepack.setup
    # Use bfbcomp_base or bfbcomp_tmp
    if ( $bfbcomp_tmp == "" ) then
      set bfbcomp = "$bfbcomp_base"
    else
      set bfbcomp = "$bfbcomp_tmp"
    endif

    set fbfbcomp = ${spval}
    if ($bfbcomp != ${spval}) then
      set fbfbcomp = ${machcomp}_${bfbcomp}.${testid}
    endif

    set testname_noid = ${spval}
    # create case for test cases
    if (${docase} == 0) then
      set soptions = ""
      # Create sorted array and remove duplicates and "none"
      set setsarray = `echo ${sets} | sed 's/,/ /g' | fmt -1 | sort -u`
      if ("${setsarray}" != "") then
        foreach field (${setsarray})
          if (${field} != "none") then
            set soptions = ${soptions}"_"${field}
          endif
        end
      endif
      # soptions starts with _
      set testname_noid = "${machcomp}_${test}_${grid}_${pesx}${soptions}"
      set testname_base = "${machcomp}_${test}_${grid}_${pesx}${soptions}.${testid}"
      if (${dosuite} == 1) then
        set testname = "${tsdir}/${testname_base}"
      else
        set testname = "${testname_base}"
      endif
      set case = ${testname}
    endif

    if (-d ${case}) then
      echo "${0}: ERROR, case ${case} already exists"
#      exit -1
      continue
    endif

    if (${case} =~ */*) then
      set casename = $case:t
    else
      set casename = $case
    endif

    # unset env variables that might not exist in env machine file
    # to avoid any carry over during multi envname suites
    unsetenv ICE_MACHINE_MAXTHREADS
    unsetenv ICE_MACHINE_MAXPES
    unsetenv ICE_MACHINE_QUIETMODE
    unsetenv ICE_MACHINE_CPPDEFS
    unsetenv ICE_MACHINE_QSTAT
    unsetenv ICE_MACHINE_MACHINFO
    unsetenv ICE_MACHINE_ENVINFO

    #------------------------------------------------------------
    # Setup case directory, copy files to case directory

    mkdir -p ${case}
    echo "`date`${0} $initargv[*]" >> ${case}/README.case

    cd ${case}
    set casedir = `pwd`
    set casescr = "${casedir}/casescripts"
    if !( -d ${casescr}) mkdir ${casescr}

    # from basic script dir to case
    foreach file (icepack.build icepack.settings Makefile icepack_in makdep.c setup_run_dirs.csh)
      if !(-e ${ICE_SCRIPTS}/$file) then
        echo "${0}: ERROR, ${ICE_SCRIPTS}/$file not found"
        exit -1
      endif
      cp -f -p ${ICE_SCRIPTS}/$file ${casedir}/
    end

    # from machines dir to case
    foreach file (env.${machcomp} Macros.${machcomp})
      if !(-e ${ICE_SCRIPTS}/machines/$file) then
        echo "${0}: ERROR, ${ICE_SCRIPTS}/machines/$file not found"
        exit -1
      endif
      cp -f -p ${ICE_SCRIPTS}/machines/$file ${casedir}/
    end

    # from basic script dir to casescr
    foreach file (parse_namelist.sh parse_settings.sh parse_namelist_from_settings.sh icepack_decomp.csh icepack.run.setup.csh icepack.test.setup.csh)
      if !(-e ${ICE_SCRIPTS}/$file) then
        echo "${0}: ERROR, ${ICE_SCRIPTS}/$file not found"
        exit -1
      endif
      cp -f -p ${ICE_SCRIPTS}/$file ${casescr}/
    end

    # from test dir to casescr
    foreach file (icepack.results.csh icepack.codecov.csh icepack.lcov.csh)
      if !(-e ${ICE_SCRIPTS}/tests/$file) then
        echo "${0}: ERROR, ${ICE_SCRIPTS}/$file not found"
        exit -1
      endif
      cp -f -p ${ICE_SCRIPTS}/tests/$file ${casescr}/
    end

    cd ${casedir}
    source ./env.${machcomp} -nomodules || exit 2

    set quietmode = false
    if ($?ICE_MACHINE_QUIETMODE) then
      set quietmode = ${ICE_MACHINE_QUIETMODE}
    endif

    if (${acct} == ${spval}) then
      if (-e ~/.cice_proj) then
        set acct = `head -1 ~/.cice_proj`
      else
        set acct = ${ICE_MACHINE_ACCT}
      endif
    endif

    if (${queue} == ${spval}) then
      if (-e ~/.cice_queue) then
        set queue = `head -1 ~/.cice_queue`
      else
        set queue = ${ICE_MACHINE_QUEUE}
      endif
    endif

    set rundir = ${ICE_MACHINE_WKDIR}/${casename}

    #------------------------------------------------------------
    # Compute a default blocksize

    if ($pesx != 1x1) then
      echo "${0}: ERROR in arguments, -p must be 1x1 if set manually"
      exit -1
    endif

    set chck = `echo ${pesx} | sed  's/^[0-9][0-9]*x[0-9][0-9]*$/OK/'`
    if (${chck} == OK) then
      set task = `echo ${pesx} | sed s/x.\*//`
      set thrd = `echo ${pesx} | sed s/.\*x//`
    else
      echo "${0}: ERROR in -p argument, ${pesx}, must be mxn"
      exit -1
    endif

    setenv ICE_DECOMP_GRID  ${grid}
    setenv ICE_DECOMP_NTASK ${task}
    setenv ICE_DECOMP_NTHRD ${thrd}

    source ${casescr}/icepack_decomp.csh
    if ($status != 0) then
      echo "${0}: ERROR, icepack_decomp.csh aborted"
      exit -1
    endif

    echo "ICE_SANDBOX  = ${ICE_SANDBOX}"
    echo "ICE_CASENAME = ${casename}"
    echo "ICE_CASEDIR  = ${casedir}"
    echo "ICE_MACHINE  = ${machine}"
    echo "ICE_ENVNAME  = ${envname}"
    echo "ICE_RUNDIR   = ${rundir}"

    #------------------------------------------------------------
    # Copy in and update icepack.settings and icepack_in files

    set fimods = ${casescr}/icepack_in.mods
    set fsmods = ${casescr}/icepack.settings.mods

    cp icepack_in ${casescr}/icepack_in.base
    cp icepack.settings ${casescr}/icepack.settings.base
    if (-e ${fimods}) rm ${fimods}
    if (-e ${fsmods}) rm ${fsmods}

cat >! ${fimods} << EOF1
# icepack.setup settings

nprocs = ${task}
data_dir = '${ICE_MACHINE_INPUTDATA}/Icepack_data/forcing'
EOF1

    # If this is a baseline-compare test, modify ICE_RUNDIR
    if ($bdir != ${spval}) then
      setenv basedir_tmp ${bdir}
    else
      setenv basedir_tmp ${ICE_MACHINE_BASELINE}
    endif
    if ("$baseGen" =~ "default") then
      set d1 = `echo ${cdate} | cut -c 3- | sed 's/-//g'`
      set t1 = `echo ${ctime} | sed 's/://g'`
      set baseGen = icepack.${shhash}.${d1}-${t1}
    endif
    if ("$baseCom" =~ "default") then
      set baseCom = `ls -t $basedir_tmp | head -1`
    endif


cat >! ${fsmods} << EOF1
# icepack.setup settings

setenv ICE_SANDBOX  ${ICE_SANDBOX}
setenv ICE_SCRIPTS  ${ICE_SCRIPTS}
setenv ICE_CASENAME ${casename}
setenv ICE_CASEDIR  ${casedir}
setenv ICE_MACHINE  ${machine}
setenv ICE_ENVNAME  ${envname}
setenv ICE_MACHCOMP ${machcomp}
setenv ICE_RUNDIR   ${rundir}
setenv ICE_GRID     ${grid}
setenv ICE_NXGLOB   ${ICE_DECOMP_NXGLOB}
setenv ICE_NTASKS   ${task}
setenv ICE_NTHRDS   ${thrd}
setenv ICE_BASELINE ${basedir_tmp}
setenv ICE_BASEGEN  ${baseGen}
setenv ICE_BASECOM  ${baseCom}
setenv ICE_SPVAL    ${spval}
setenv ICE_QUIETMODE  ${quietmode}
setenv ICE_TEST     ${test}
setenv ICE_TESTNAME ${testname_noid}
setenv ICE_BFBCOMP  ${fbfbcomp}
setenv ICE_ACCOUNT  ${acct}
setenv ICE_QUEUE    ${queue}
setenv ICE_COVERAGE ${coverageflag}
EOF1

    if (${sets} != "") then
      set setsx = `echo ${sets} | sed 's/,/ /g'`
      set setsxorig = "$setsx"
      set setsx = ""
      foreach name ($setsxorig)
        if (-e ${ICE_SCRIPTS}/options/set_files.${name}) then
          echo "adding options files from set_files.${name}"
          echo "`date`${0} adding options files from set_files.${name}" >> ${casedir}/README.case
          set setsnew = `cat ${ICE_SCRIPTS}/options/set_files.${name}`
          foreach nset ($setsnew)
            if ($nset !~ "#*") then
              set setsx = "$setsx $nset"
            endif
          end
        else
          set setsx = "$setsx $name"
        endif
      end

    else
      set setsx = ""
    endif

    if (${docase} == 0) then
      # from test options to casescr in case any test time changes are applied
      if (-e ${ICE_SCRIPTS}/tests/test_${test}.files) then
        cp -f -p ${ICE_SCRIPTS}/tests/test_${test}.files ${casescr}
        foreach file (`cat ${casescr}/test_${test}.files`)
          if (-e ${ICE_SCRIPTS}/options/$file) then
            cp -f -p ${ICE_SCRIPTS}/options/$file ${casescr}
          else
            echo "${0}: ERROR, could not find $file from test_${test}.files"
            exit -1
          endif
        end
      endif
    endif

    foreach name (${grid} ${test} ${setsx})
      set found = 0
      if (-e ${ICE_SCRIPTS}/options/set_nml.${name}) then

cat >> ${fimods} << EOF2

# set_nml.${name}

EOF2
        cat ${ICE_SCRIPTS}/options/set_nml.${name} >> ${fimods}

cat >> ${fimods} << EOF2

EOF2
        echo "adding namelist mods set_nml.${name}"
        echo "`date`${0} adding namelist modes set_nml.${name}" >> ${casedir}/README.case
        set found = 1
      endif
      if (-e ${ICE_SCRIPTS}/options/set_env.${name}) then

cat >> ${fsmods} << EOF2

# set_env.${name}

EOF2

        cat ${ICE_SCRIPTS}/options/set_env.${name} >> ${fsmods}

cat >> ${fsmods} << EOF2

EOF2
        echo "adding env mods set_env.${name}"
        echo "`date`${0} adding namelist modes set_env.${name}" >> ${casedir}/README.case
        set found = 1
      endif
      if (${found} == 0) then
        if (${name} == ${test}) then
          #echo "${ICE_SCRIPTS}/options/set_[nml,env].${name} not found"
          echo "`date`${0} ${ICE_SCRIPTS}/options/set_[nml,env].${name} not found" >> ${casedir}/README.case
        else
          echo "${0}: ERROR, ${ICE_SCRIPTS}/options/set_[nml,env].${name} not found"
          echo "`date`${0}: ERROR, ${ICE_SCRIPTS}/options/set_[nml,env].${name} not found" >> ${casedir}/README.case
          exit -1
        endif
      endif
    end

    ${casescr}/parse_settings.sh icepack.settings ${fsmods}
    ${casescr}/parse_namelist.sh icepack_in ${fimods}
    source ./icepack.settings
    source ./env.${machcomp} -nomodules || exit 2
    ${casescr}/parse_namelist_from_settings.sh icepack_in icepack.settings

    #------------------------------------------------------------
    # Generate run script

    source ./icepack.settings
    source ./env.${machcomp} -nomodules || exit 2

    ${casescr}/icepack.run.setup.csh
    if ($status != 0) then
      echo "${0}: ERROR, icepack.run.setup.csh aborted"
      exit -1
    endif

    #------------------------------------------------------------
    # Generate test script

    if (${docase} == 0) then
      # Print information to stdout
      echo "Creating scripts for $test test"

      # Generate test script
      ${casescr}/icepack.test.setup.csh 
      if ($status != 0) then
        echo "${0}: ERROR, icepack.test.setup.csh aborted"
        exit -1
      endif

    endif

    #------------------------------------------------------------
    # Generate testsuite stuff

    if ( ${dosuite} == 1 ) then
      cd ${ICE_SANDBOX}
      # Write build and run commands to suite.run

cat >> ${tsdir}/results.csh << EOF
cat ${testname_base}/test_output >> results.log
EOF

cat >> ${tsdir}/report_codecov.csh << EOF
mkdir ${testname_base}/codecov_output
cp ${rundir}/compile/*.{gcno,gcda} ${testname_base}/codecov_output/

EOF

cat >> ${tsdir}/report_lcov.csh << EOF
lcov --gcov-tool gcov -c -d ${rundir}/compile -o ${testname_base}/lcov.info
if (-s ${testname_base}/lcov.info) then
  set lcovalist = "\${lcovalist} -a ${testname_base}/lcov.info"
endif

EOF

cat >> ${tsdir}/suite.run << EOF
cd ${testname_base}
./icepack.build
./icepack.submit | tee -a ../suite.jobs
cd ..
EOF
    
      # Reset case for the next test in suite
      set case = ${spval}

      echo "" 
      echo "---" 
      echo "" 
    endif

  # This is the foreach end for the testsuite
  end
# This is the foreach end for the envnames
end

#-----------------------------------------------------
# more testsuite stuff

if ( ${dosuite} == 1 ) then

   # Add code to post processing scripts

  if ($?ICE_MACHINE_QSTAT) then
    cat >! ${tsdir}/poll_queue.env << EOF0
setenv ICE_MACHINE_QSTAT ${ICE_MACHINE_QSTAT}
EOF0
  endif

  cat ${casescr}/icepack.results.csh >> ${tsdir}/results.csh

  cat ${casescr}/icepack.codecov.csh >> ${tsdir}/report_codecov.csh

  cat ${casescr}/icepack.lcov.csh >> ${tsdir}/report_lcov.csh

  # build and submit tests
  cd ${tsdir}
  ./suite.run | tee suite.log
  if ($report == 1) then
    echo "Reporting results"
    ./poll_queue.csh
    ./results.csh
    ./report_results.csh
  endif
  if ($coverage == 1) then
    echo "Generating coverage reports"
    ./poll_queue.csh
    ./report_lcov.csh
#    ./report_codecov.csh
  endif
  cd ${ICE_SANDBOX}

endif

echo " "
echo "${0} done"
echo " "
exit 0

